namespace RewriteSTLInAndOut {
    template<typename T>std::ostream& operator<<(std::ostream& out, const std::set<T>& obj) {out << "set(";for(auto it = obj.begin(); it != obj.end(); it++) {out << (it == obj.begin() ? "" : ", ") << *it;}out << ")";return out;}
    template<typename T>std::ostream& operator<<(std::ostream& out, const std::vector<T>& obj) {out << "vector(";for(auto it = obj.begin(); it != obj.end(); it++) {out << (it == obj.begin() ? "" : ", ") << *it;}out << ")";return out;}
    template<typename K,typename V> std::ostream& operator<<(std::ostream& out, const std::map<K, V>& obj) { out << "map("; for (auto it = obj.begin(); it != obj.end(); it++) {out << (it == obj.begin() ? "" : ", ") << it->first << ": " << it->second; }out << ")"; return out; }
    template<typename T1,typename T2> std::ostream& operator<<(std::ostream& out, const std::pair<T1, T2>& obj) { out << "<" << obj.first << ", " << obj.second << ">"; return out; }
    template<typename T>std::ostream& operator<<(std::ostream& out, const std::unordered_set<T>& obj) { out << "unordered_set("; bool first = true; for (auto& e : obj) { if (!first) {out << ", "; }out << e; first = false; } out << ")"; return out; }
    template<typename K,typename V>std::ostream& operator<<(std::ostream& out, const std::unordered_map<K, V>& obj) { out << "unordered_map("; bool first = true; for (auto& kv : obj) { if (!first) {out << ", "; }out << kv.first << ": " << kv.second; first = false; } out << ")"; return out; }
}
using namespace RewriteSTLInAndOut;